home *** CD-ROM | disk | FTP | other *** search
/ Gold Medal Software 1 / Gold Medal Software Volume 1 (Gold Medal) (1994).iso / graphics / tierra40.arj / TIERRA / SLICERS.C < prev    next >
C/C++ Source or Header  |  1992-09-09  |  3KB  |  113 lines

  1. /* slicers.c   9-9-92  time slicing routines for the Tierra Simulator */
  2. /* Tierra Simulator V4.0: Copyright (c) 1991, 1992 Tom Ray & Virtual Life */
  3.  
  4. #ifndef lint
  5. static char     sccsid[] = "@(#)slicers.c    1.5     7/21/92";
  6. #endif
  7.  
  8. #include "license.h"
  9. #include "tierra.h"
  10. #include "extern.h"
  11.  
  12. #ifdef MEM_CHK
  13. #include <memcheck.h>
  14. #endif
  15.  
  16. void SlicerPhoton()
  17. {   Pcells  ce;
  18.     I32s  size_slice;
  19.     I32s   a;
  20.     I8s   md;
  21.  
  22.     do a = tlrand() % SoupSize;
  23.     while(IsFree(a));
  24.     WhichCell(a, &ThisSlice, &md);
  25.     size_slice = PhotonSlide(a, PhotonInst, PhotonSize, PhotonWidth);
  26.     size_slice = (I32s) (10. * pow((double) size_slice,(double) PhotonPow));
  27.     if(SizDepSlice)
  28.     {   ce = ThisSlice;
  29.         size_slice = (I32s) ((double) size_slice *
  30.             pow((double) ce->mm.s / (double) AverageSize, (double) SlicePow));
  31.     }
  32.     TimeSlice(ThisSlice, size_slice);
  33. }
  34.  
  35. I32s PhotonFit(a, PhotonInst, PhotonSize)
  36. I32s  a;
  37. I8s  *PhotonInst;
  38. I32s  PhotonSize;
  39. {   I32s  i, j, fit, tfit = 0;
  40.  
  41.     for(j = 0; j < PLOIDY; j++)
  42.     {   fit = 0;
  43.         for(i = 0; i < PhotonSize; i++)
  44. #if PLOIDY == 1
  45.             if(soup[ad(a + i)].inst == *(PhotonInst + i)) fit++;
  46. #else /* PLOIDY > 1 */
  47.             if(soup[ad(a + i)][j].inst == *(PhotonInst + i)) fit++;
  48. #endif /* PLOIDY > 1 */
  49.         if(fit > tfit)
  50.             tfit = fit;
  51.     }
  52.     return tfit;
  53. }
  54.  
  55. I32s PhotonSlide(a, PhotonInst, PhotonSize, PhotonWidth)
  56. I32s  a;
  57. I8s  *PhotonInst;
  58. I32s  PhotonSize, PhotonWidth;
  59. {   I32s  i, ws2, tfit, fit = 0;
  60.  
  61.     ws2 = (PhotonSize + PhotonWidth) / 2;
  62.     for(i = 0; i < PhotonWidth; i++)
  63.     {   tfit = PhotonFit(ad(a - ws2 + i), PhotonInst, PhotonSize);
  64.         if(tfit > fit) fit = tfit;
  65.     }
  66.     return fit;
  67. }
  68.  
  69. void PhotonTranslate(PhotonInst, PhotonWord)
  70. I8s  *PhotonInst;
  71. I8s  *PhotonWord;
  72. {   I32s  i;
  73.  
  74.     for(i = 0; i < PhotonSize; i++)
  75.     {   if(*(PhotonWord + i) > 47 && *(PhotonWord + i) < 58)
  76.             *(PhotonInst + i) = *(PhotonWord + i) - 48;
  77.         else if (*(PhotonWord + i) > 96 && *(PhotonWord + i) < 119)
  78.             *(PhotonInst + i) = *(PhotonWord + i) - 87;
  79.         else *(PhotonInst + i) = 0;
  80.     }
  81. }
  82.  
  83. void SlicerQueue()
  84. {   Pcells  ce;
  85.     I32s  size_slice;
  86.  
  87.     ce = ThisSlice; /* ThisSlice is current cell in queue */
  88.     if(SizDepSlice)
  89.         size_slice = (I32s) pow((double) ce->mm.s,(double) SlicePow);
  90.     else size_slice = SliceSize;
  91.     TimeSlice(ThisSlice, size_slice);
  92.     IncrSliceQueue(); /* increment ThisSlice to next cell in queue */
  93. }
  94.  
  95. void RanSlicerQueue()
  96. {   Pcells  ce;
  97.     I32s  size_slice;
  98.  
  99.     ce = ThisSlice; /* ThisSlice is current cell in queue */
  100.     if(SizDepSlice)
  101.     {
  102.         if(SlicePow == 1.0)    /* Speed hack by dan july 92 */
  103.        size_slice = (ce->mm.s);
  104.     else
  105.            size_slice = (I32s) pow((double) ce->mm.s,(double) SlicePow);
  106.     }
  107.     else size_slice = SliceSize;
  108.     size_slice = (I32s) SlicFixFrac * size_slice +
  109.         tlrand() % (I32s) ((SlicRanFrac * size_slice) + 1);
  110.     TimeSlice(ThisSlice, size_slice);
  111.     IncrSliceQueue(); /* increment ThisSlice to next cell in queue */
  112. }
  113.